package util;

/**
 * @author Liaorun
 */
public class ConvertStringToInteger {

    public static int convert(String s) {
        if (s == null || s.equals("")) {
            return 0;
        }

        char[] str = s.toCharArray();

        if (!isValid(str)) {
            throw new RuntimeException("can not convert");
        }

        // 是否是负数
        boolean neg = str[0] == '-';
        // 应为是10进制所以除以10，防止位数过多时溢出
        final int minq = Integer.MIN_VALUE / 10;
        final int minr = Integer.MIN_VALUE % 10;
        int res = 0;
        int cur = 0;

        for (int i = neg ? 1 : 0; i < str.length; i++) {
            // str[i] = '0' cur -> 0;
            // str[i] = '1' cur -> -1;
            // str[i] = '4' cur -> -4;
            cur = '0' - str[i];
            // 中途转化过程中，溢出的时候
            // 防止下一步乘法溢出 || 防止下一步加法溢出
            if (res < minq || (res == minq && cur < minr)) {
                throw new RuntimeException("can not convert");
            }
            res = res * 10 + cur;
        }

        // 系统最小值0x80000000 不能取相反数变成正数
        if (!neg && res == Integer.MIN_VALUE) {
            throw new RuntimeException("can not convert");
        }

        return neg ? res : -res;
    }

    private static boolean isValid(char[] str) {

        // 第一位必须是-号 或者数字
        if (str[0] != '-' && (str[0] < '0' || str[0] > '9')) {
            return false;
        }

        // 符号后面不能为空或者0
        if (str[0] == '-' && (str.length == 1 || str[1] == '0')) {
            return false;
        }

        // 0 不能连接任何字符
        if (str[0] == '0' && str.length > 1) {
            return false;
        }

        // 处理第一位其他位置必须是数字字符
        for (int i = 1; i < str.length; i++) {
            if (str[i] < '0' || str[i] > '9') {
                return false;
            }

        }

        return true;
    }
}
